package user

import (
	"errors"
	"lao-a/helper"
	"lao-a/models/model"

	"github.com/yl10/kit/encrypt"
	"github.com/yl10/kit/orm"

	"strconv"
)

const STATUS_NORMAL = 1

// DAO 当前数据库操作对象
type DAO struct {
	ctx *helper.Context
	db  *orm.XormPlus
}

// NewDAO 初始化DAO
func NewDAO(ctx *helper.Context) *DAO {
	return &DAO{
		ctx: ctx,
		db:  ctx.GetDB(),
	}
}

// GetUserById 获取用户信息
func (m *DAO) GetUserById(userId int) (*model.SysUser, error) {
	var user model.SysUser
	_, err := m.db.Where("user_id=?", strconv.Itoa(userId)).Get(&user)

	if err != nil {
		return nil, helper.LogError("获取人员信息失败", err)
	}

	return &user, nil
}

//GetUserByPhone 通过手机号获取用户信息
func (m *DAO) GetUserByPhone(tel string) (model.SysUser, error) {
	query := `
			SELECT * FROM
		    	sys_user t
		    WHERE
			phone = '` + tel + `'`

	user := new(model.SysUser)
	if has, err := m.db.Sql(query).Get(user); err != nil {
		return *user, err
	} else if !has {
		return *user, errors.New("账户不存在")
	}

	return *user, nil
}

//ValidUserLogin 验证登陆
func (m *DAO) ValidUserLogin(tel, pass string) (model.SysUser, error) {
	user, err := m.GetUserByPhone(tel)
	if err != nil {
		return user, err
	}

	if !m.ValidatePassword(&user, pass) {
		return user, helper.LogError("用户密码不正确")
	}

	return user, nil
}

// ValidUserToken 通过口令验证人员
// func (m *DAO) ValidUserToken(token *model.TaTokenSignin) (model.SysUser, error) {
// 	var user model.SysUser
// 	t := model.TaTokenSignin{}
// 	has, err := m.db.Where("token=?", token.Token).Get(&t)
// 	if err != nil {
// 		return user, helper.LogError("查询口令信息失败", err)
// 	}

// 	if !has || t.ExpireTime.Before(time.Now()) {
// 		return user, errors.New("没有找到口令或者口令已过期")
// 	}

// 	if t.ClientId != token.ClientId {
// 		return user, errors.New("验证失败, 验证对象发生变化")
// 	}

// 	if t.Secret != token.Secret {
// 		return user, errors.New("口令验证失败")
// 	}

// 	return m.GetUserByPhone(token.ClientId)
// }

// ValidatePassword 验证密码是否正确
func (m *DAO) ValidatePassword(user *model.SysUser, password string) bool {
	return user.Passwd == encrypt.Md5(password, strconv.Itoa(user.UserId))
}

// UpdateUserInfo 更新用户信息
// 暂时只支持头像与名称的修改
func (m *DAO) UpdateUserInfo(user *model.SysUser, cols []string) error {
	_, err := m.db.Update(user, cols, "user_id=?", user.UserId)
	if err != nil {
		return helper.LogError("修改用户信息出错", err)
	}

	return nil
}

// UpdatePassword 更新用户密码
func (m *DAO) UpdatePassword(userId int, newPass string) error {
	password := encrypt.Md5(newPass, strconv.Itoa(userId))

	sql := "update sys_user set passwd=? where user_id=?"

	_, err := m.db.Exec(sql, password, userId)
	if err != nil {
		return helper.LogError("更新新密码出错", err)
	}

	return nil
}

// UpdateAvatar 更新用户头像
// func (m *DAO) UpdateAvatar(userId, avatar string) error {
// 	var user model.SysUser
// 	has, err := m.db.Where("user_id=?", userId).Get(&user)
// 	if err != nil {
// 		return helper.LogError("更新用户头像出错", err)
// 	}

// 	if !has {
// 		return helper.LogError("更新用户头像出错, 用户不存在")
// 	}

// 	sql := "update sys_user set avatar=? where user_id=?"

// 	_, err = m.db.Exec(sql, avatar, userId)
// 	if err != nil {
// 		return helper.LogError("更新用户头像出错", err)
// 	}

// 	return nil
// }

// PhoneNum 获取手机号码的唯一性
func (m *DAO) PhoneNum(phone string) (int64, error) {
	total, err := m.db.Where("phone=?", phone).Count(&model.SysUser{})
	if err != nil {
		return 0, helper.LogError("验证库中手机号码出错", err)
	}

	return total, nil
}

// SignUp 用户注册
func (m *DAO) SignUp(signInfo map[string]interface{}) (*model.SysUser, error) {
	user := model.SysUser{
		UserId:   signInfo["UserId"].(int),
		UserName: signInfo["UserName"].(string),
		Passwd:   encrypt.Md5(signInfo["Passwd"].(string), signInfo["UserId"].(string)),
		Phone:    signInfo["Phone"].(string),
		Status:   STATUS_NORMAL,
	}

	if _, err := m.db.Insert(&user); err != nil {
		return nil, helper.LogError("用户注册失败", err)
	}

	return &user, nil
}

// CheckUserRoute 校验用户路由权限
// func (m *DAO) CheckUserRoute(userId, route, method string) (int, error) {
// 	router := model.SysRouter{}

// 	beego.Error(userId, route, method)
// 	_, err := m.db.SQL("select * from sys_router where method = ? and ? regexp path", strings.ToUpper(method), route).Get(&router)
// 	if err != nil {
// 		return http.StatusInternalServerError, helper.LogError("获取路由配置信息出错", err)
// 	}

// 	// 没有对应的路由
// 	if router.RouteId == 0 {
// 		return http.StatusOK, nil
// 	}

// 	// 不需要验证权限
// 	if router.Weight == 0 {
// 		return http.StatusOK, nil
// 	}

// 	// 如果没有登录
// 	if userId == "" {
// 		return http.StatusUnauthorized, helper.LogError("请先登录系统")
// 	}

// 	return http.StatusOK, nil
// }

// SaveSignToken 保存登录信息
// func (m *DAO) SaveSignToken(token *model.TaTokenSignin) error {
// 	has, err := m.db.Where("client_id=?", token.ClientId).Get(&model.TaTokenSignin{})
// 	if err != nil {
// 		return helper.LogError("查询用户登录Token失败", err)
// 	}

// 	if has {
// 		// return errors.New("用户登录Token已经保存")
// 		if _, err := m.db.Where("client_id=?", token.ClientId).Delete(&model.TaTokenSignin{}); err != nil {
// 			return helper.LogError("清理用户登录记录失败", err)
// 		}
// 	}

// 	_, err = m.db.Insert(token)
// 	if err != nil {
// 		return helper.LogError("保存用户登录Token失败", err)
// 	}

// 	return nil
// }
